home *** CD-ROM | disk | FTP | other *** search
/ Ian & Stuart's Australian Mac: Not for Sale / Another.not.for.sale (Australia).iso / fade into you / being there / Services / Gopher / Gopher+.txt < prev    next >
Text File  |  1993-07-30  |  35KB  |  1,267 lines

  1.  
  2. Gopher+
  3.  
  4.  
  5. upward compatible enhancements to 
  6. the Internet Gopher protocol
  7.  
  8.  
  9.  
  10. Farhad Anklesaria, Paul Lindner, Mark P.  McCahill, 
  11. Daniel Torrey, David Johnson, Bob Alberti   
  12.  
  13. Microcomputer and Workstation  Networks Center / 
  14. Computer and Information Systems
  15. University of Minnesota
  16.  
  17. July 30, 1993
  18.  
  19.  
  20.  
  21. gopher+  n.  1. Hardier strains of mammals of the 
  22. family  Geomyidae.  2. (Amer. colloq.) Native or 
  23. inhabitant of  Minnesota, the Gopher state, in full 
  24. winter regalia (see  PARKA).  3. (Amer. colloq.) 
  25. Executive secretary.  4.  (computer tech.) Software 
  26. following a simple protocol for  burrowing through a 
  27. TCP/IP internet, made more powerful by  simple 
  28. enhancements (see CREEPING FEATURISM).
  29.  
  30.  
  31. Abstract
  32.  
  33. The internet Gopher protocol was designed for 
  34. distributed  document search and retrieval. The 
  35. documents "The internet  Gopher protocol: a 
  36. distributed document search and retrieval protocol"  
  37. and internet RFC 1436 describe the basic  protocol and 
  38. has an overview of how to implement new client  and 
  39. server applications. This document describes a set of 
  40. enhancements to the syntax, semantics and 
  41. functionality of  the original Gopher protocol.
  42.  
  43.  
  44. Distribution of this document is unlimited.  Please 
  45. send  comments to the Gopher development team:  
  46. <gopher@boombox.micro.umn.edu>.  Implementation of  
  47. the  mechanisms described here is encouraged. 
  48.  
  49.  
  50.  
  51. 1.    Introduction
  52.  
  53. The Internet Gopher protocol was designed primarily to 
  54. act as a distributed document  delivery system.  It 
  55. has enjoyed increasing popularity, and  is being used 
  56. for purposes that were not visualized when the  
  57. protocol was first outlined.  The rest of this 
  58. document  describes the Gopher+ enhancements in a non-
  59. rigorous but easily read and understood  way.  There 
  60. is a short BNF-like section at the end for exact  
  61. syntax descriptions.  Throughout the document, "F" 
  62. stands  for the ASCII TAB character. There is an 
  63. implicit carriage  return and linefeed at the ends of 
  64. lines; these will only be explicitly  mentioned where 
  65. necessary to avoid confusion. To understand  this 
  66. document, you really must be familiar with the basic  
  67. Gopher protocol.
  68.  
  69.  
  70. Servers and clients understanding the Gopher+ 
  71. extensions will transmit extra information at the ends 
  72. of list and request lines.  Old, basic gopher clients 
  73. ignore such information.  New  Gopher+ aware servers 
  74. continue to work at their old level  with unenhanced 
  75. clients.  The extra information that can be  
  76. communicated by Gopher+ clients may be used to summon 
  77. new capabilities to bridge  the most keenly felt 
  78. shortcomings of the venerable old  Gopher.
  79.  
  80.  
  81.  
  82.  
  83. 2.     How does Gopher+ work?
  84.  
  85. Gopher+ enhancements rely on transmitting an "extra" 
  86. tab  delimited fields beyond what regular (old) Gopher 
  87. servers and clients now use.  If most existing (old)  
  88. clients were to encounter extra stuff beyond the 
  89. "port"  field in a list (directory), most would ignore 
  90. it. Gopher+  servers will return item descriptions in 
  91. this form:
  92.  
  93.  
  94. 1Display stringFselector stringFhostFportFextra 
  95. stuff<CRLF>
  96.  
  97.  
  98. If an existing (old) client has problems with 
  99. additional  information beyond the port, it should not 
  100. take much more  than a simple tweak to have it discard 
  101. unneeded stuff.
  102.  
  103.  
  104.  
  105.  
  106. 2.1    Advisory issued to client maintainers.
  107.  
  108. If it does not do this already, your existing client 
  109. should be modified  as soon as possible to ignore 
  110. extra fields beyond what it  expects to find.  This 
  111. will ensure thatyour clients does not break  when it 
  112. encounters Gopher+ servers in gopherspace.
  113.  
  114.  
  115. All the regular Gopher protocol info remains intact 
  116. except for:
  117.  
  118.  
  119. (1)  Instead of just a CRLF after the port field in 
  120. any item  of a list (directory) there may be an 
  121. optional TAB followed  by extra stuff as noted above 
  122. (explanation to follow).
  123.  
  124.      
  125.  
  126. (2) In the original Gopher protocol, there was 
  127. provision for a date-time descriptor (sec 3.6) to be 
  128. sent  after the selector (for use by autoindexer 
  129. beasts).  As far  as we know, while the descriptor is 
  130. implemented in the Mac  server, it is not in any other 
  131. server and no clients or  daemons use it.  This is a 
  132. good time to withdraw this feature. The basic gopher  
  133. protocol has been revised for the final time and will 
  134. be  frozen.
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141. 2.2    Gopher+ item lists.
  142.  
  143. Gopher servers that can utilize the Gopher+ 
  144. enhancements  will send some additional stuff 
  145. (frequently the character "+") after the port field 
  146. describing any list item.  eg:
  147.  
  148.  
  149. 1Some old directoryFfoo selectorFhost1Fport1
  150.  
  151. 1Some new directoryFbar selectorFhost1Fport1F+
  152.  
  153. 0Some file or otherFmoo selectorFhost2Fport2F+
  154.  
  155.  
  156. The first line is the regular old gopher item 
  157. description. The second line is new Gopher+  item 
  158. description.  The third line is a Gopher+ description 
  159. of a document. Old  gopher clients can request the 
  160. latter two items using old  format gopher selector 
  161. strings and retrieve the items. New,  Gopher+ savvy 
  162. clients will notice the trailing + and know that they 
  163. can do extra  things with these kinds of items.
  164.  
  165.  
  166.  
  167.  
  168.  
  169. 2.3    Gopher+ data transfer.
  170.  
  171. If a client sends out a Gopher+ type request to a 
  172. server (by  tagging on a tab and a "+" to the 
  173. request):
  174.  
  175.  
  176.     bar selectorF+
  177.  
  178.  
  179. The server may return the response in one of three 
  180. ways; examples  below:
  181.  
  182.  
  183.   +5340<CRLF><data>
  184.  
  185.   
  186.  
  187.   +-1<CRLF><data><CRLF>.<CRLF>
  188.  
  189.   
  190.  
  191.   +-2<CRLF><data>
  192.  
  193.  
  194. The first response means: I am going to send exactly  
  195. 5340 bytes at you and they will begin right after this 
  196. line.  The second response means: I have no idea how 
  197. many bytes I  have to send (or I am lazy), but I will 
  198. send a period on a  line by itself when I am done.  
  199. The  third means:  I really  have no idea how many 
  200. bytes I have to send, and what's more,  they COULD 
  201. contain the <CRLF>.<CRLF> pattern, so just read until 
  202. I close  the connection.
  203.  
  204.  
  205. The first character of a response to a Gopher+ query 
  206. denotes  success (+) or failure (-). Following that is 
  207. a token to be  interpreted as a decimal number. If the 
  208. number is >= 0, it  describes the length of the 
  209. dataBlock. If = -1, it means the  data is period 
  210. terminated. If = -2, it means the data ends  when the 
  211. connection closes.  
  212.  
  213.  
  214. The server may return an error also, as in:
  215.  
  216.  
  217. --1<CRLF><data><CRLF>.<CRLF>
  218.  
  219.  
  220. The (short!) error message will be in ASCII text in 
  221. the data part.  The first token on the  first line of 
  222. the error text (data) contains an error-code  (an 
  223. integer).  It is recommended that the first line also  
  224. contain  the e-mail address of the administrator of 
  225. the  server (in angle brackets). Both the error-code 
  226. and the email address may easily be  extracted by the 
  227. client.  Subsequent lines contain a short  error 
  228. message that may be displayed to the user. Basic error  
  229. codes are:
  230.  
  231.  
  232.     1    Item is not available.
  233.  
  234.     2    Try again later ("eg.  My load is too high 
  235. right now.")
  236.  
  237.     3    Item has moved.  Following the error-code is 
  238. the  gopher descriptor
  239.  
  240.         of where it now lives.
  241.  
  242.  
  243. More error codes may be defined as the need arises.
  244.  
  245.  
  246.  
  247. This should be obvious: if the client sends out an 
  248. "old"  Gopher kind of request:
  249.  
  250.    
  251.  
  252.     bar selector
  253.  
  254.    
  255.  
  256. the server will know that it is talking to an old 
  257. client and  will respond in the old way. This means 
  258. that old gopher  clients can still access information 
  259. on Gopher+ servers.
  260.  
  261.  
  262.  
  263.  
  264. 2.4    Gopher+ client requests.
  265.  
  266.  
  267. Clients can send requests to retrieve the contents of 
  268. an item in this form:
  269.  
  270.  
  271.     
  272. selectorstringF+[representation][FdataFlag]<CRLF>[dat
  273. ablock]
  274.  
  275.  
  276. If dataFlag is '0', or nonexistent, then the client 
  277. will not  send any data besides the selector string.  
  278. If the dataFlag  is '1' then a block of data will 
  279. follow in the same format as Section 2.3.  The  client 
  280. can send a large amount of data to the server in the  
  281. dataBlock.  Representations or alternative views of an  
  282. item's contents may be discovered by interrogating the  
  283. server about the item's attribute information; this is 
  284. explained below.
  285.  
  286.  
  287. Note that in the original Gopher protocol, a query 
  288. submitted to an index server might have a selector 
  289. string followed by a TAB and the words for which the 
  290. index server was being asked to search. In Gopher+, 
  291. the extra TAB and Gopher+ information follow the words 
  292. for which the server is being asked to search. Gopher+ 
  293. client have to be smart enough to know that in the 
  294. case of a type 7 item (an index server) they append 
  295. the Gopher+ information after the words being searched 
  296. for.
  297.  
  298.  
  299.  
  300. 2.5    Gopher+ Item Attribute Information.
  301.  
  302.  
  303. The most basic enhancement of Gopher+ items is the 
  304. ability  to associate information about an item such 
  305. as size, alternative views, the administrator, an 
  306. abstract, etc. with the item. To get Attribute 
  307. Information, a client can  send out a request to the 
  308. gopher server that looks like  this:
  309.  
  310.  
  311.     selector stringF!<CRLF>
  312.  
  313.  
  314. (think of "!" as an upside-down i for "information"). 
  315. To the  server this means "Instead of returning the 
  316. contents of the item, return the item's Attribute  
  317. Information". The Attribute Information is returned as 
  318. an  ASCII text stream containing blocks of 
  319. information.For  example, a server might return:
  320.  
  321.  
  322.     +INFO: 0Some file or otherFmoo 
  323. selectorFhost2Fport2F+
  324.  
  325.     +ADMIN:
  326.  
  327.      Admin: Frodo Gophermeister <fng@bogus.edu> 
  328.  
  329.       Mod-Date: Wed Jul 28 17:02:01 1993 
  330. <19930728170201>
  331.  
  332.     +VIEWS: 
  333.  
  334.      Text/plain: <10k>
  335.  
  336.      application/postscript: <100k>
  337.  
  338.      Text/plain De_DE: <15k>
  339.  
  340.        application/MacWriteII: <45K>
  341.  
  342.     +ABSTRACT: 
  343.  
  344.      This is a short (but multi-line) abstract about 
  345. the
  346.  
  347.      item. Two or three lines ought to be enough
  348.  
  349.  
  350. The beginning of a block of information is denoted by 
  351. a "+"  in column 1 of  a line. Another way to think of 
  352. it is: the  name of each block begins with a + and the 
  353. rest of the name cannot contain a +. Each line of 
  354. information within a block  begins with a space so 
  355. that it is easy to locate the beginning of a block. 
  356.  
  357.  
  358. There can be multiple blocks of information about an 
  359. item,  but the first block must be the one-line +INFO 
  360. block  containing the keyword +INFO followed by the 
  361. gopher item  description. This is done to make it easy 
  362. to associate  informational attributes with the gopher 
  363. items to which they  refer (see section 2.7 for some 
  364. good reasons for doing  this). The very first line of 
  365. Attribute Information for an item contains a one-line 
  366. +INFO block  containing the gopher descriptor for the 
  367. item.  All Gopher+  servers must return an "+INFO" 
  368. block for all items listed by  the server. Also 
  369. present may be an +ADMIN block that can be  many lines 
  370. long.  The server must also send an +ADMIN block when 
  371. asked to  send all the item's attributes (as in the 
  372. example above).   The +ADMIN block must contain at 
  373. least an Admin attribute  and Mod-Date attributes, 
  374. though there may be many other  administrative items 
  375. also present in the +ADMIN block.  The Admin (the  
  376. administrator of the item) and Date (the date of the 
  377. item's  last modification) attributes are required to 
  378. be returned by  the server, and other optional 
  379. attributes may be returned as  well.  In this example, 
  380. there are two pieces of information within the +ADMIN 
  381. block  (Admin and Mod-Date). The Admin attribute must 
  382. contain the  e-mail address of an administrator inside 
  383. angle brackets.  The Admin line might also contain the 
  384. administrator's name  and phone number. The Date line 
  385. must contain the modification date in angle  brackets. 
  386. The format of the date is <YYYYMMDDhhmmss> where  YYYY 
  387. is year, MM is month, DD is day, hh is hours, mm is  
  388. minutes, and ss is seconds.
  389.  
  390.  
  391. The third block in the example is the +VIEWS block. 
  392. This block lists different formats in which the 
  393. document can be  retrieved. The first format listed is 
  394. what the server  believes to be the preferred format. 
  395. A gopher client might  display the list of possible 
  396. view labels of the item to the  user and let the user 
  397. select the view they prefer. Alternatively, a smart 
  398. client  might look at the content of the labels and 
  399. preferentially  retrieve Postscript views of items. 
  400. Note that the view  labels are structured. View labels 
  401. specify a Content-Type  (application/Postscript, 
  402. Text/plain, etc.), an optional language (En_US, De_DE, 
  403. etc.)  and an optional size. Note that the View labels 
  404. for content type use the MIME content types to specify 
  405. names of the variious views. The optional language 
  406. descriptors use the ISO-639 codes for representing 
  407. languages to name the language. Smart clients might 
  408. want to translate these rather cryptic codes into 
  409. something mere mortals can read and understand.
  410.  
  411.  
  412. The client software can pick off the  size of each 
  413. view IF there are any angle brackets on the  line. 
  414. There might not be a size that the server cares to  
  415. tell you about. Also this might NOT be the exact size 
  416. that the server will wind up  delivering to you if you 
  417. ask for it... but it should be  reasonably close. This 
  418. information makes it possible for  clever clients to 
  419. select views based on size, data  representation, or 
  420. language. See section 2.6 for how alternate 
  421. representations (views) are  retrieved. 
  422.  
  423.  
  424. The next block in the example is an (optional) 
  425. +ABSTRACT.  Here the block consists of lines of text 
  426. that might be  displayed to the user. 
  427.  
  428.  
  429. Other blocks of information can defined and added as 
  430. the need arises. For instance, a Neuromancer-esque 3-D   
  431. cyberspace attribute might be accommodated by 
  432. including a  3D-ICON block (with an image to display 
  433. in 3-space) and a  3D-COORDINATE block (with y,x, and 
  434. z coordinates). More  immediate needs can also 
  435. addressed by defining other information blocks. For  
  436. instance, a SCRIPT block would be a natural place to 
  437. put  information for scripting telnet sessions. 
  438. Information  blocks give us an extensible way of 
  439. adding attributes (or  what Macintosh programmers call 
  440. resources) to gopher items. 
  441.  
  442.  
  443. Some of the really cool ideas we have for information  
  444. attributes may require sending large amounts of data, 
  445. some  of which may not be easily represented as ASCII 
  446. text, but  the idea of the attributes information is 
  447. that it is a relatively compact list of attributes. 
  448. These somewhat  conflicting desires can be reconciled 
  449. by allowing references  to gopher items in an 
  450. attribute. For example, an +ABSTRACT  block might be 
  451. returned this way:
  452.  
  453.  
  454.     +ABSTRACT: 0long abstractFselectorFhost2Fport2F+
  455.  
  456.  
  457. In this example, the abstract is a document that 
  458. resides on  a gopher server. By allowing references to 
  459. to gopher items,  we can also accommodate data that 
  460. must be sent in an 8-bit  clear stream by using the 
  461. Gopher+ methods for retrieving  binary data. 
  462.  
  463.  
  464. If both a reference to an attribute and an explicit 
  465. value for  the attribute are present in an attribute 
  466. list, the  preferred version is the explicit value. In 
  467. the example  below, the preferred version is "the 
  468. short abstract goes  here". 
  469.  
  470.  
  471.     +ABSTRACT: 0long abstractFselectorFhost2Fport2F+
  472.  
  473.        the short abstract goes here
  474.  
  475.  
  476. Note that if you want to have several views of (for 
  477. example)  an +ABSTRACT this is possible by using a 
  478. reference to a item  residing on a gopher server 
  479. because the item can have its  own attributes. 
  480.  
  481.  
  482. Attributes names are case sensitive (easier to match 
  483. and  more of them).  There is no need to "preregister" 
  484. all  possible attributes since we cannot anticipate 
  485. all possible  future needs. However it would be 
  486. reasonable to maintain a  registry for implementors 
  487. and administrators so duplication can be avoided.  
  488. Server implementors or administrators can request that 
  489. new  attributes be included in the attribute registry.
  490.  
  491.  
  492. Dream on: What gets us excited are alternate 
  493. representations  for directory lists.  Sure, the 
  494. standard representation for a gopher directory list 
  495. is known to us  all.  But isn't hypertext (in a WWW 
  496. sense) an alternate kind  of directory list?  We also 
  497. envisioned a "geographical view"  (GView?) mapping 
  498. servers onto a map of the world (throw up a  gif 
  499. picture and then overlay dots based on latitude and 
  500. longitude or xy  coordinates).  OK.  Dream off.
  501.  
  502.  
  503.  Note that interested parties outside gopherspace have 
  504. long  and complex wish-lists for "attributes" that all  
  505. well-dressed Internet citizens should have.  We don't 
  506. want to comment on the use or value of these laundry-
  507. lists.  Suffice it to say that nothing precludes 
  508. server  administrators from including whatever 
  509. attributes they see  fit to include. Certainly IAFA 
  510. blocks are desirable, bearing  UDIs, URL's or whatever 
  511. else is desired.  The gopher community will probably 
  512. arrive at a  list of "recommended" attributes that 
  513. server administrators  should try to support.  Because 
  514. not every server  administrator sees advantage to 
  515. cluttering Attribute Info  files with information 
  516. their  primary users will never need, it does not seem 
  517. fair to   "force" folks to include them; most will 
  518. just ignore the  harsh protocol guideline and the 
  519. value of the protocol will  be diminished.  We want to 
  520. mandate as little as we possibly  can.
  521.  
  522.  
  523.  
  524.  
  525.  
  526. 2.6    Using Attribute Info: Alternate 
  527. representations (+VIEWS).
  528.  
  529.  
  530. The user may locate a document and wonder if there are   
  531. representations of it besides, say, the standard Text.  
  532. Using the appropriate client incantation (Option  
  533. Double-Click? or whatever) the user indicates a wish 
  534. to see what's  available.  The client retrieves the  
  535. Attribute Information, displays the list of views to 
  536. the  user in some kind of scrolling list dialog.  User 
  537. selects a  line and client now requests the document 
  538. in say, Postscript  representation:
  539.  
  540.  
  541.    the selectorF+application/Postscript
  542.  
  543.  
  544.  
  545. Smart clients are not precluded from doing things like  
  546. "Always get Postscript if you can" or "Always get   
  547. Postscript if that is less than 700K in size." etc. 
  548. And the  "smarter" you make it, the hairier your 
  549. client will become - unless you are a user interface 
  550. wizard of awesome  proportions. While the example 
  551. above is of fetching a  document's postscript view, 
  552. there is nothing precluding  having different views 
  553. for directories. In the dream  sequence earlier, we 
  554. imagined a geographic view of a directory. For a 
  555. client to fetch that  view, it would say this:
  556.  
  557.  
  558.    the selectorF+GView
  559.  
  560.  
  561.  
  562. 2.7    Getting attributes for all items in a 
  563. directory in one  transaction.
  564.  
  565.  
  566. Heavyweight/clever/special-purpose clients may want to 
  567. know  all the attributes of items in a given directory 
  568. in one transaction. The  "$" command is used to 
  569. request all the attributes of a  directory at once. 
  570. For instance, a client might sent the  request:
  571.  
  572.  
  573.     selector stringF$
  574.  
  575.  
  576.  and the server might return this:
  577.  
  578.  
  579.     +INFO: 0Salmon dogsFsome selectorFhost2Fport2F+
  580.  
  581.     +ADMIN:
  582.  
  583.      Admin: Frodo Gophermeister <fng@bogus.edu> 
  584.  
  585.      Mod-Date: August 15, 1992 <19920815185503>
  586.  
  587.     +VIEWS: 
  588.  
  589.      Text/plain: <10k>
  590.  
  591.      application/Postscript De_DE: <100k>
  592.  
  593.     +ABSTRACT: 
  594.  
  595.        A great recipe for making salmon
  596.  
  597.     +INFO: 0Hot pupsFother selectorFhost3Fport3F+
  598.  
  599.     +ADMIN:
  600.  
  601.      Admin: Bilbo Gophernovice <bng@bogus.edu> 
  602.  
  603.      Date: <19910101080003>
  604.  
  605.  
  606. In this example, the server returned the attribute 
  607. lists for  two items because there were only two items 
  608. in the  directory.. The client software can easily 
  609. separate the attributes for the  items since each 
  610. attribute list starts with "+INFO". It is  also easy 
  611. for the client to use the "$" command to get  
  612. directory listings since the gopher item descriptor is 
  613. on  the +INFO line for each item. 
  614.  
  615.  
  616. Note that the $ command is the only way to find the  
  617. administrator of a remote link.  To get the full 
  618. attribute  information for a link on another machine 
  619. may require asking  the master machine for the item 
  620. information.  It is possible  to append which 
  621. attributes you are interested in retrieving after the 
  622. $, eg:
  623.  
  624.  
  625.     some directory selectorF$+VIEWS
  626.  
  627. or
  628.  
  629.     other directory selectorF$+VIEWS+ABSTRACT
  630.  
  631.     
  632.  
  633. The $ command makes it possible for a client that does 
  634. not  mind burning bandwidth to get attribute 
  635. information for all items as the user navigates 
  636. gopherspace. Clients using  2400 bps SLIP links will 
  637. probably not use this method... but  clients on 
  638. Ethernet may not mind. This command may also be useful 
  639. for building smart indexes of items in gopherspace.  
  640. Note that the specific requested  attributes are only 
  641. suggestions to the server that the  client would like 
  642. less than a full set of attributes.  The  server may 
  643. choose to ignore the request (if it is not  capable of 
  644. extracting the required attributes) and return the 
  645. client the full set anyway.   Other caveats:  even if 
  646. the attributes requested are not  available, the 
  647. server WILL NOT return an error, but will  send 
  648. whatever IS available.  It is the client's  
  649. responsibility inspect the returned attributes.
  650.  
  651.  
  652. Analogous to use of the $ command, the ! command can 
  653. also be  used to request certain attribute blocks.
  654.  
  655.  
  656.  
  657.  
  658. 2.8    Gopher+ Interactive Query items.
  659.  
  660.  
  661. The principle here is based on Roland Schemer's "Q/q" 
  662. type  ideas. We're calling it the Interactive Query 
  663. enhancements... 
  664.  
  665.  
  666. The server may list items that have a "?" following 
  667. the port  field:
  668.  
  669.  
  670.    0A fileFfile selectorFhostFportF?
  671.  
  672.    1A directoryFdir selectorFhostFportF?
  673.  
  674.  
  675. Now the fact that there's something after the port 
  676. field means that these are Gopher+ items.  Old clients 
  677. will still be able to show such items in lists, but  
  678. if they simply send the old style plain selector 
  679. string to  retrieve them, the server will respond with 
  680. an old style  error telling them to get an updated 
  681. client.  New clients will know that before getting one 
  682. of these items, it will be necessary to  retrieve 
  683. questions from the server, have the user answer  them, 
  684. and then feed the answers back to the server along  
  685. with the selector. The questions to be asked of the 
  686. user are  retrieved from the server by looking at the 
  687. +ASK attribute in the item's attribute  information.
  688.  
  689.  
  690.  
  691.  
  692. When the user selects a query item, the client quickly  
  693. connects to the server and requests the Attribute  
  694. Information for the item.  Then the client extracts 
  695. the  information in the +ASK attribute block. Here's 
  696. an example:
  697.  
  698.  
  699.     +INFO: 0inquisitiveFmoo moo 
  700. selectorFhost2Fport2F+
  701.  
  702.     +ADMIN
  703.  
  704.      Admin: Frank Gophermeister <fng@bogus.edu>
  705.  
  706.      Mod-Date: August 15, 1992 <19920815185503>
  707.  
  708.       +ASK: 
  709.  
  710.        Ask: How many volts?
  711.  
  712.        Choose: Deliver electric shock to administrator 
  713. now?FYesFNot!
  714.  
  715.   
  716.  
  717.   
  718.  
  719. The client will use all lines in the order they appear 
  720. in  the +ASK attribute block.  The content will be 
  721. presented to  the user as questions or prompts or 
  722. dialogs or something  like that.
  723.  
  724.  
  725. The "Ask" presents the user with a question, supplies 
  726. a default text answer if it  exists and allows the 
  727. user to enter a one-line responce.
  728.  
  729.  
  730. The "AskP" presents the user with a question, and 
  731. bullets out the responce typed in by the user so that 
  732. someone watching over the user's sholder cannot read 
  733. the responce. 
  734.  
  735.  
  736. The "AskL" presents the user with a question, and 
  737. ideally should allo the user to enter several lines of 
  738. responce. 
  739.  
  740.  
  741. The "AskF" requests the user for a new local filename,  
  742. presumably for stashing the response returned by the 
  743. server.  It may supply a default filename.
  744.  
  745.  
  746. The "Select" presents the user with a set of options 
  747. from which the use can select one or many. This is 
  748. equivalent to Macintosh check boxes.
  749.  
  750.  
  751. The "Choose" presents the user with a few short 
  752. choices only one of which may be selected at a time. 
  753. This is equivalent to Macintosh radio buttons.
  754.  
  755.  
  756. The "ChooseF" requests that the user select an 
  757. existing  local file, presumably for sending to the 
  758. server.  On some  systems, the client writer or 
  759. administrator might want to  restrict the selection of 
  760. such files to the current directory  (ie. not allow 
  761. paths in the filename to prevent sending   things like 
  762. password files).
  763.  
  764.  
  765. The n responses harvested from the user are sent on to 
  766. the  server as the first n lines in the dataBlock.  
  767. There can only be one file sent, and it will be the 
  768. remainder of  the dataBlock if any. If there is an 
  769. AskL the responce is returned with a count of the 
  770. number of lines entered by the user on a line by 
  771. itself, followed by the lines entered by the user.
  772.  
  773.  
  774. Gopher was originally designed as an essentially 
  775. anonymous  document retrieval protocol to facilitate 
  776. easy access to  information rather than limited 
  777. access.  Various kinds of  restrictive mechanisms have 
  778. been implemented at the server  end (for example, 
  779. access restriction by source IP address);  however if 
  780. you have sensitive information, we emphasize that 
  781. putting it under a  Gopher's nose is not a good idea.
  782.  
  783.  
  784.  
  785.  
  786. The folks with a hirsute tendency will have noticed 
  787. that all  these interactions  are static rather than 
  788. truly dynamic and  interactive.  In other words, the  
  789. server cannot ask different questions in response to 
  790. different answers.   +ASK does not constitute a  
  791. scripting language by any  means.
  792.  
  793.  
  794. To do "true" scripting, we have to do one of two 
  795. things
  796.  
  797.  
  798. 1.  Write a full language parser/interpreter into 
  799. clients.  The server loads a whole script into the 
  800. client's brain, and the client  "runs" it.   This 
  801. rather grossly violates the spirit of  simplicity in 
  802. cross-platform gopher implementation.   However, when 
  803. and if a standard scripting language is  adopted, 
  804. there will be room for it in a SCRIPT attribute block.
  805.  
  806.  
  807. 2.  Client enters a complex back-and-forth transaction 
  808. with  the server. This requires the server, client, or 
  809. both to  save rather a lot of state.  NOPE!  Server 
  810. saving state  means holding open a connection or 
  811. (worse) the server retaining tokens between 
  812. connections.  Client saving state  means the server 
  813. has an even worse job to do.
  814.  
  815.  
  816. As Opus the Penguin would say:  a Hairball.
  817.  
  818.  
  819.  
  820. 2.9    Gopher+ Pictures, Sounds, Movies.
  821.  
  822.  
  823. A lot of folks need ability to retrieve and display  
  824. pictures, but there is no real consensus on ONE format 
  825. for these pictures.  We don't want to define a type 
  826. character for every oddball  picture type.  Gopher+ 
  827. handles Pictures, Movies, and Sounds  by defining 
  828. three item types: ":" for bitmap images, ";" for  
  829. movies, and "<" for sounds (originally I, M, and S 
  830. were suggested, but they  were informally in use in 
  831. other ways; the only thing magic   about ":", ";", and 
  832. "<", is that they are the first  characters after '9')  
  833.  
  834.  
  835. Note that there is NO default format  for Pictures, 
  836. Movies and Sounds; the specific format of the image, 
  837. movie, or sound  must be gleaned from the +VIEWS 
  838. information for the item  (eg. Gif, PICT, TIFF, etc.).
  839.  
  840.  
  841.  
  842.  
  843. Appendix I
  844.  
  845.  
  846. Required attributes and suggested attributes.
  847.  
  848.  
  849.  
  850. A1.0 The +INFO attribute block
  851.  
  852.  
  853. The +INFO atttribute block is sent whenever an item's 
  854. attributes are requested.   It is required that the 
  855. Attribute Information list for an  item must contain a 
  856. one-line +INFO attribute, and the +INFO  attribute 
  857. must contain the gopher+ descriptor for the item.
  858.  
  859.  
  860.     +INFO: 1Nice stuffF/selectorFhostFportF+
  861.  
  862.  
  863.  
  864. A2.0 The +ADMIN attribute
  865.  
  866.  
  867.  A Gopher+ server is required to have an +ADMIN block 
  868. for  every item and the +ADMIN block must contain 
  869. Admin and a  Mod-Date lines: 
  870.  
  871.  
  872.     +ADMIN:
  873.  
  874.      Admin: [comments] <administrator e-mail address> 
  875.  
  876.      Mod-Date: [comments] <YYYYMMDDhhmmss>
  877.  
  878.  
  879. In addition to the required lines, we recommend that 
  880. the  +ADMIN attribute of items returned by a full-text 
  881. search  engine contain a SCORE attribute. The SCORE 
  882. attribute should  contain the relevance ranking (an 
  883. integer) of the item. 
  884.  
  885.  
  886.      Score: relevance-ranking
  887.  
  888.  
  889. We recommend that the +ADMIN attribute of a full-text 
  890. search  engine contain a Score-Range attribute. This 
  891. attribute is  used to specify the range of values 
  892. taken on by the  relevance ranking scores of items 
  893. returned by the search engine. The Score-Range makes 
  894. it possible to  normalize scores from different search 
  895. engine technologies.  The first number is the lower 
  896. bound, the second number is  the upper bound.
  897.  
  898.  
  899.      Score-range: lower-bound upper-bound
  900.  
  901.  
  902. We also recommend that the +ADMIN attribute for the 
  903. root of the server (i.e. what  you get back when you 
  904. ask for the attributes of the item  with the empty 
  905. selector string) also contain these fields:
  906.  
  907.  
  908.       Site: the name of the site 
  909.  
  910.       Org: organization or group owning the site 
  911.  
  912.       Loc: city, state, country
  913.  
  914.       Geog: latitude longitude
  915.  
  916.        TZ: timezone as gmt-offset
  917.  
  918.  
  919. Other useful attributes might include:
  920.  
  921.  
  922.       Provider: who provided this item
  923.  
  924.     Author: who wrote this item
  925.  
  926.     Creation-Date: when it was born <YYYYMMDDhhmmss>
  927.  
  928.     Expiration-Date: when it expires <YYYYMMDDhhmmss>
  929.  
  930.  
  931.  
  932. A3.0 The +VIEWS attribute
  933.  
  934.  
  935. The +VIEWS attribute is used to specify alternative  
  936. representations of an item. The form of the +VIEWS 
  937. attribute  is: 
  938.  
  939.  
  940.     +VIEWS: [gopher descriptor]
  941.  
  942.      Content-Type[ viewLanguage]: [<56K>]
  943.  
  944.      Content-Type[ viewLanguage]: [<93K>]
  945.  
  946.      Content-Type[ viewLanguage]: [<77K>]
  947.  
  948.  
  949. Some values for Content-Type are
  950.  
  951.  
  952.     Text/plain, application/Postscript, image/Gif,  
  953. image/jpeg, 
  954.  
  955.  
  956. Content Types are defined by the Internet Assigned 
  957. Numbers  Authority (IANA).  To register a new content 
  958. type send e-mail to  IANA@isi.edu.  For a 
  959. comprehensive list, consult the most  up-to-date MIME 
  960. Request for Comments (RFC).  A list of  currently 
  961. defined views may be retrieved by anonymous ftp  from 
  962. isi.edu in the directory 
  963.  
  964.  
  965. /pub/in-notes/MIME/mime-types
  966.  
  967.  
  968. All gopher servers must support the Text/plain view 
  969. for  readable documents and the application/gopher-
  970. menu view (the  basic Gopher+ directory list) for 
  971. directories.  These are  the views that must be 
  972. returned by default.  If all a server supports is the 
  973. default views, then it may  omit the +VIEWS attribute 
  974. block (although we suggest that it  not do so).
  975.  
  976.  
  977. The viewLanguage is defined as a concatanation of two 
  978. ISO  standard values, the ISO 639 language code and 
  979. the ISO-3166 country  code.  
  980.  
  981.  
  982. Some values for viewLanguage are:
  983.  
  984.  
  985.     En_US, De_DE, Es_ES, Se_SE
  986.  
  987.  
  988.  
  989. A4.0 The +ABSTRACT attribute
  990.  
  991.  
  992. The +ABSTRACT attribute is used to specify a short 
  993. abstract  for the item. The form of the +ABSTRACT 
  994. attribute is: 
  995.  
  996.  
  997.     +ABSTRACT: [gopher reference]
  998.  
  999.       A line of text<CRLF>
  1000.  
  1001.      another line of text<CRLF>
  1002.  
  1003.      still another line of text.<CRLF>
  1004.  
  1005.  
  1006. We recommend that a description of the sorts of 
  1007. information  at the site,  a postal address, a phone 
  1008. number, and the  administrator name for the site be 
  1009. included in the +ABSTRACT attribute for the server 
  1010. root (i.e. what you  get when you ask for the 
  1011. attribute list of the server with  no selector 
  1012. string).
  1013.  
  1014.  
  1015.  
  1016.  
  1017.  
  1018. Appendix II
  1019.  
  1020.  
  1021. Paul's NQBNF (Not Quite BNF) for the Gopher+ 
  1022. Enhancements.
  1023.  
  1024.  
  1025.  
  1026. Note:  This is modified BNF (as used by the Pascal 
  1027. people) with a few English modifiers thrown in.   
  1028. Stuff enclosed in '{}' can be repeated zero or more 
  1029. times.  Stuff  in '[]' denotes a set of items.  The '-
  1030. ' operator denotes set  subtraction.
  1031.  
  1032.  
  1033. This section is not quite solid yet.  Please send us 
  1034. information on any errors you might notice.
  1035.  
  1036.  
  1037. Directory Entity
  1038.  
  1039.  
  1040. CR-LF     ::= Carriage Return Character followed by 
  1041. Line Feed  character. 
  1042.  
  1043. Tab       ::= ASCII Tab character
  1044.  
  1045. NUL       ::= ASCII NUL character
  1046.  
  1047. PLUS      ::= ASCII '+' character
  1048.  
  1049. LEFT      ::= ASCII '<' character
  1050.  
  1051. RIGHT      ::= ASCII '>' character
  1052.  
  1053. OCTET     ::= $00 -> $ff
  1054.  
  1055. UNASCII   ::= OCTET - [Tab CR-LF NUL]
  1056.  
  1057. UNASCIINOPLUS ::= UNASCII - [PLUS]
  1058.  
  1059. UNASCIINOANGLE ::= UNASCII - [LEFT, RIGHT]
  1060.  
  1061. Lastline  ::= '.'CR-LF
  1062.  
  1063. TextBlock ::= Block of ASCII text not containing 
  1064. Lastline pattern.
  1065.  
  1066. Type      ::= UNASCII
  1067.  
  1068. DisplayString ::= {UNASCII}
  1069.  
  1070. Selector  ::= {UNASCII}
  1071.  
  1072. Otherflds ::= {UNASCII + TAB}
  1073.  
  1074. Host      ::= {{UNASCII - ['.']} '.'} {UNASCII - 
  1075. ['.']}
  1076.  
  1077.  
  1078.  
  1079. Note: This is a Fully Qualified Domain Name as defined 
  1080. in RFC  830. (e.g. gopher.micro.umn.edu)  Hosts that 
  1081. have a CR-LF  TAB or NUL  in their name get what they 
  1082. deserve.
  1083.  
  1084.  
  1085. Digit     ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' 
  1086. | '7' | '8'  | '9'
  1087.  
  1088. DigitSeq  ::= digit {digit}.
  1089.  
  1090. Port      ::= DigitSeq.
  1091.  
  1092.  
  1093. Note: Port corresponds the the TCP Port Number, its 
  1094. value should be in the range  [0..65535]; port 70 is 
  1095. officially assigned to gopher.
  1096.  
  1097.  
  1098.  
  1099. Bool      ::= '0' | '1'
  1100.  
  1101. G+Field   ::= '+' | '?'
  1102.  
  1103.  
  1104. Success   ::= '+' | '-'.
  1105.  
  1106. Transfer  ::= DigitSeq | '-1' | '-2'
  1107.  
  1108. DataHead  ::= Success Transfer CR-LF
  1109.  
  1110. DataBlock ::= DataHead {OCTET}
  1111.  
  1112.  
  1113.  
  1114. G1DirEntity ::= Type DisplayString Tab Selector Tab 
  1115. Host Tab Port  Tab Otherflds CR-LF 
  1116.  
  1117. G+DirEntity ::= Type DisplayString Tab Selector Tab 
  1118. Host Tab Port  Tab G+Field     
  1119.  
  1120.                 CR-LF 
  1121.  
  1122.  
  1123.  
  1124. Notes:
  1125.  
  1126.    It is *highly* recommended that the DisplayString 
  1127. field contain only printable  characters, since many 
  1128. different clients will be using it.   However if eight 
  1129. bit characters are used, the characters should  
  1130. conform with the ISO-Latin1 Character Set.  The length 
  1131. of the  User displayable line should be less than 70 
  1132. Characters; longer lines  may not fit across some 
  1133. screens. Warning! The Selector string can  be longer 
  1134. than 255 characters. 
  1135.  
  1136.  
  1137. Menu Entity
  1138.  
  1139. Menu      ::= DataHead {G+DirEntity}.
  1140.  
  1141.  
  1142. Continues ::= Bool
  1143.  
  1144. Representation ::= 'Text' | 'List'  | 'Postscript' | 
  1145. 'MacWriteII' | 'RTF' |{UNASCII}
  1146.  
  1147.  
  1148.  
  1149. Retrieving a document/menu/etc.:
  1150.  
  1151.  
  1152. C: Opens Connection
  1153.  
  1154. S: Accepts Connection
  1155.  
  1156. C: Sends Selector String Tab '+' Representation [Tab 
  1157. DataFlag]
  1158.  
  1159. C: [Optional] Client sends a DataBlock depending on 
  1160. value of DataFlag.
  1161.  
  1162. S: Sends DataBlock
  1163.  
  1164. Connection is closed by either client or server 
  1165. (typically  server).
  1166.  
  1167.  
  1168. Spaceline    ::= ' ' {UNASCII} CR-LF
  1169.  
  1170. Blockname     ::=  '+' {UNASCIINOPLUS}
  1171.  
  1172. Attrblock    ::= Blockname ' ' [G+Direntry] CR-LF  
  1173. {Spaceline}
  1174.  
  1175. Attrval      ::= SPACE {UNASCII} CR-LF
  1176.  
  1177. E-Mail       ::= {UNASCII} s.t. it conforms to RFC 822
  1178.  
  1179. Adminval     ::= ' Admin:' {UNASCII} '<'  E-Mailaddr 
  1180. '>' CR-LF
  1181.  
  1182. Dateval      ::= ' Mod-Date:' {UNASCII} '<' 
  1183. YYYYMMDDhhmmss '>'  CR-LF
  1184.  
  1185. AdminReq     ::= AdminVal Dateval
  1186.  
  1187. Infoblock    ::= '+INFO: ' G+Direntry CR-LF
  1188.  
  1189. AdminBlock    ::= '+ADMIN: ' {G+Direntry} CR-LF 
  1190. AdminReq  {Attrval}
  1191.  
  1192. Language     ::= 'English' | 'French' | 'German' | 
  1193. {UNASCII}
  1194.  
  1195. ViewVal      ::= ' ' Representation [' ' Language] ":"  
  1196. ASCIINOANGLE '<' 
  1197.  
  1198.                  Size 'k>' CR-LF
  1199.  
  1200. ViewBlock    ::= '+VIEWS: ' {G+Direntry} CR-LF 
  1201. {ViewVal}
  1202.  
  1203. AttrBlocks   ::= InfoBlock ViewBlock {AttrBlock}
  1204.  
  1205.  
  1206.  
  1207. Retrieving item Information.
  1208.  
  1209.  
  1210.  
  1211. For non-index server (non-type 7 items)
  1212.  
  1213.  
  1214. C: Opens Connection
  1215.  
  1216. S: Accepts Connection
  1217.  
  1218. C: Sends Selector String Tab '!' {BlockName}CR-LF
  1219.  
  1220. S: Sends DataBlock with data in AttrrBlocks format.
  1221.  
  1222. Connection is closed by either client or server 
  1223. (typically  server).
  1224.  
  1225.  
  1226.  
  1227. For index server (type 7 items) the client asks the 
  1228. search engine to so a search for nothing
  1229.  
  1230. (i.e. the client does not provide any words to search 
  1231. for) and appends a TAB and a "!" after the null-
  1232. search:
  1233.  
  1234.  
  1235. C: Opens Connection
  1236.  
  1237. S: Accepts Connection
  1238.  
  1239. C: Sends Selector String Tab Tab '!' {BlockName}CR-LF
  1240.  
  1241. S: Sends DataBlock with data in AttrrBlocks format.
  1242.  
  1243. Connection is closed by either client or server 
  1244. (typically  server).
  1245.  
  1246.  
  1247. Attributes ::= {AttrBlocks}
  1248.  
  1249.  
  1250.  
  1251. Retrieving all Item Information entries for a 
  1252. directory.
  1253.  
  1254.  
  1255. C: Opens Connection
  1256.  
  1257. S: Accepts Connection
  1258.  
  1259. C: Sends Selector String Tab '$'{BlockName} CR-LF
  1260.  
  1261. S: Sends DataBlock with data in Attributes format.
  1262.  
  1263. Connection is closed by either client or server 
  1264. (typically  server).
  1265.  
  1266.  
  1267.